﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HerGoS.Administration.Engine;
using HerGoS.ControlsUI;
using HerGoS.Administration.Entities;
using HerGoS.Interfaces;
using HerGoS.WebControlExtend;
using System.Web.Services;

namespace HerGoS.WebUI.Administracion.Entidades
{
    public partial class Entidades_ABM : PageBase
    {


        #region Propiedades


        public Entidad Entidad
        {
            get
            {
                if (ViewState["Entidad"] != null)
                    return (Entidad)ViewState["Entidad"];
                return null;
            }
            set
            {
                ViewState["Entidad"] = value;
            }

        }


        public int contadorContacto
        {
            get
            {
                if (ViewState["contadorContacto"] != null)
                    return (int)ViewState["contadorContacto"];
                return 0;
            }
            set
            {
                ViewState["contadorContacto"] = value;
            }
        }


        public int contadorDomicilio
        {
            get
            {
                if (ViewState["contadorDomicilio"] != null)
                    return (int)ViewState["contadorDomicilio"];
                return 0;
            }
            set
            {
                ViewState["contadorDomicilio"] = value;
            }
        }




        #endregion

      

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                LoadCombos();
                if (Request.QueryString["id"] == null)
                {
                    Entidad = new Entidad();
                   
                }
                else
                {
                    var Id = Convert.ToInt32(Request.QueryString["id"]);
                    Entidad = GestorEntidades.Obtener(Id);
                   MappingFromObjectToControls();

                }
                Initialize();

            }
        }

        private void LoadGridContacts()
        {
            GridContacto.DataSource = GestorContacto.Activos(Entidad);
            GridContacto.DataBind();
        }


        protected void btnGuardarEntidad_Click(object sender, EventArgs e)
        {
            try
            {
                MappingControlsToObject();

                if (Entidad.Persistencia == EstadoPersistencia.INSERT)
                {
                    var entidadResult = GestorEntidades.Consultar(Entidad.Denominacion);
                    if (entidadResult != null)
                    {
                        var script = @"$(function(){{parent.MensajePuestoDuplicado('{0}');}});";
                        script = string.Format(script, entidadResult.Denominacion);
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "closedialog", script, true);
                        return;
                    }
                }

                GestorEntidades.Guardar(Entidad);
                Entidad.Domicilios = null;
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "closedialog", "parent.IntervaloCerrarPopup();", true);

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public void Initialize()
        {

            this.btn_AgregarDomicilio.Settings(new ButtonExtText());
            this.btn_Cerrar_dialog_domicilio.Settings(new ButtonExtText());
            this.btn_DialogDomicilio.Settings(new ButtonExtText());
            this.btnGuardarEntidad.Settings(new ButtonExtText());
            this.btnCerrar.Settings(new ButtonExtText());
            this.GridDomicilio.Settings(new GridViewExtBasic());
            this.GridDomicilio.AllowPaging = false;
            this.GridContacto.Settings(new GridViewExtBasic());
            this.GridContacto.AllowPaging = false;
            this.btn_AltaContacto.Settings(new ButtonExtText());
            this.btn_DialogContact.Settings(new ButtonExtText());
            this.btn_Cerrar_dialog_contact.Settings(new ButtonExtText()); 

            LoadGridDomicilios();
            LoadGridContacts();
            LoadAutoria(Entidad);
        }




        private void LoadCombos()
        {
            this.cboSuperior.DataSource = GestorEntidades.Consultar();
            cboSuperior.DataTextField = "Denominacion";
            cboSuperior.DataValueField = "OID";
            cboSuperior.DataBind();
            cboSuperior.Items.Insert(0, new ListItem("--Ninguno-- ", "0"));

            this.cboJuridiccion.DataSource = GestorJurisdicciones.Consultar();
            cboJuridiccion.DataTextField = "Descripcion";
            cboJuridiccion.DataValueField = "OID";
            cboJuridiccion.DataBind();
            cboJuridiccion.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            // combos domicilio
            this.cboDcilioTipoContacto.DataSource = GestorTipoContacto.Consultar(); 
            cboDcilioTipoContacto.DataTextField = "Descripcion";
            cboDcilioTipoContacto.DataValueField = "OID";
            cboDcilioTipoContacto.DataBind();
            cboDcilioTipoContacto.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));

            this.cboPais.DataSource = GestorPaises.Consultar();
            cboPais.DataTextField = "Nombre";
            cboPais.DataValueField = "OID";
            cboPais.DataBind();

            cboPais.SelectedIndex = 2;
            //this.cbProvincia.DataSource = GestorProvincia.Consultar(null, null, null, Convert.ToInt32(cboPais.SelectedValue), null);
            //cbProvincia.DataTextField = "Nombre";
            //cbProvincia.DataValueField = "OID";
            //cbProvincia.DataBind();

            //cbProvincia.SelectedIndex = 1;
            //this.cboCiudad.DataSource = GestorCiudad.Consultar(null, null, null, Convert.ToInt32(cbProvincia.SelectedValue), null);
            //cboCiudad.DataTextField = "Nombre";
            //cboCiudad.DataValueField = "OID";
            //cboCiudad.DataBind();

            cboTipoContacto.DataSource = GestorTipoContacto.Consultar();
            cboTipoContacto.DataTextField = "Descripcion";
            cboTipoContacto.DataValueField = "OID";
            cboTipoContacto.DataBind();
            cboTipoContacto.Items.Insert(0, new ListItem("--Seleccione-- ", "0"));


        }

        private void LoadGridDomicilios()
        {
            GridDomicilio.DataSource = GestorDomicilio.Activos(Entidad);
            GridDomicilio.DataBind();
        }

        protected void btn_AgregarDomicilio_Click(object sender, EventArgs e)
        {
            int iddomicilio = hidDomicilio.Value.ToInteger();
            if (iddomicilio != 0)
            {
                foreach (var item in Entidad.Domicilios.Where(x => x.OID == iddomicilio))
                {
                    item.TipoContacto = GestorTipoContacto.Obtener(cboDcilioTipoContacto.SelectedValue.ToInteger());
                    item.Calle = txtCalle.Text;
                    item.Altura = this.txtAltura.Text;
                    item.Piso = this.txtPiso.Text;
                    item.Departamento = this.txtDepartamento.Text;
                    item.Interseccion = this.txtInterseccion.Text;
                    item.CodigoPostal = this.txtCP.Text;
                    item.Ciudad = GestorCiudad.Obtener(cboCiudad.SelectedValue.ToInteger());
                    item.Observaciones = this.txtDcilio_Observacion.Text;

                    if (chkDomicilioPcipal.Checked)
                    {
                        Entidad.Domicilios.ForEach(x => x.Principal = false);
                        item.Principal = true;
                    }
                    else
                    {
                        item.Principal = false;
                    }

                }
                LoadGridDomicilios();
                hidDomicilio.Value = "0";
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "Activar", "ActivarSolapaDomicilio(); ", true);
            }
            else
            {
                Domicilio domicilio = new Domicilio();
                domicilio.TipoContacto = GestorTipoContacto.Obtener(cboDcilioTipoContacto.SelectedValue.ToInteger());
                domicilio.Calle = txtCalle.Text;
                domicilio.Altura = this.txtAltura.Text;
                domicilio.Piso = this.txtPiso.Text;
                domicilio.Departamento = this.txtDepartamento.Text;
                domicilio.Interseccion = this.txtInterseccion.Text;
                domicilio.CodigoPostal = this.txtCP.Text;
              //  domicilio.Ciudad = GestorCiudad.Obtener(cboCiudad.SelectedValue.ToInteger());
                domicilio.Ciudad = GestorCiudad.Obtener(this.hidCiudad.Value.ToInteger());
                domicilio.Observaciones = this.txtDcilio_Observacion.Text;

                if (chkDomicilioPcipal.Checked)
                {
                    domicilio.Principal = true;
                    Entidad.Domicilios.ForEach(x => x.Principal = false);

                }
                else
                {
                    domicilio.Principal = false;
                }

                this.contadorDomicilio = contadorDomicilio - 1;
                domicilio.OID = contadorDomicilio;
                Entidad.Domicilios.Add(domicilio);
                LoadGridDomicilios();

            }

        }


        protected void btn_AltaContacto_Click(object sender, EventArgs e)
        {

           
            if ((!string.IsNullOrEmpty(txtTelefono.Text)) || (!String.IsNullOrEmpty(txtEmail.Text)) || (!string.IsNullOrEmpty(txtFax.Text)))
            {

                int idcontacto = this.hidContacto.Value.ToInteger();
                if (idcontacto > 0)
                {
                    foreach (var item in Entidad.Contactos.Where(x => x.OID == idcontacto))
                    {
                        item.Email = this.txtEmail.Text;
                        item.Telefono = this.txtTelefono.Text;
                        item.Fax = this.txtFax.Text;
                        item.TipoContacto = GestorTipoContacto.Obtener(cboTipoContacto.SelectedValue.ToInteger());
                      
                        if (chkPrincipal.Checked)
                        {
                            Entidad.Contactos.ForEach(x => x.Principal = false);
                            item.Principal = true;
                        }
                        else
                        {
                            item.Principal = false;
                        }

                        LoadGridContacts();
                        hidContacto.Value = "0";

                    }
                }

                else
                {
                    Contacto c = new Contacto();
                    c.Email = this.txtEmail.Text;
                    c.Telefono = this.txtTelefono.Text;
                    c.Fax = this.txtFax.Text;
                    c.TipoContacto = GestorTipoContacto.Obtener(cboTipoContacto.SelectedValue.ToInteger());
                   
                    if (chkPrincipal.Checked)
                    {
                        c.Principal = true;
                        Entidad.Contactos.ForEach(x => x.Principal = false);

                    }
                    else
                    {
                        c.Principal = false;
                    }
                    this.contadorContacto = contadorContacto - 1;
                    c.OID = contadorContacto;
                    Entidad.Contactos.Add(c);
                    LoadGridContacts();

                }

                this.txtEmail.Text = String.Empty;
                this.txtTelefono.Text = String.Empty;
                this.txtFax.Text = String.Empty;
                this.cboTipoContacto.SelectedValue = "0";
                this.chkPrincipal.Checked = false;
            }
            
        }

        protected void GridDomicilio_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Borrar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int id = Convert.ToInt32(GridDomicilio.DataKeys[index].Value);


                if (id > 0)
                {
                    Domicilio domicilio = Entidad.Domicilios.Where(x => x.OID == id).FirstOrDefault();
                    domicilio.Persistencia = EstadoPersistencia.DELETE;

                }
                else
                {
                    Entidad.Domicilios.RemoveAt(index);

                }
                LoadGridDomicilios();
            }
            if (e.CommandName == "Editar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int oid = Convert.ToInt32(GridDomicilio.DataKeys[index].Value);
                this.hidDomicilio.Value = oid.ToString();
                Domicilio domicilio;
                domicilio = Entidad.Domicilios.Find(x => x.OID == oid);

                cboDcilioTipoContacto.SelectedValue = domicilio.TipoContacto.OID.ToString();
                txtCalle.Text = domicilio.Calle;
                txtAltura.Text = domicilio.Altura.ToString();
                txtPiso.Text = domicilio.Piso.ToString();
                txtDepartamento.Text = domicilio.Departamento;
                this.cbProvincia.DataSource = GestorProvincia.Consultar();
                cbProvincia.DataTextField = "Nombre";
                cbProvincia.DataValueField = "OID";
                cbProvincia.DataBind();

                this.cboCiudad.DataSource = GestorCiudad.Consultar();
                cboCiudad.DataTextField = "Nombre";
                cboCiudad.DataValueField = "OID";
                cboCiudad.DataBind();

                cbProvincia.SelectedValue = domicilio.Ciudad.Provincia.OID.ToString();
                cboCiudad.SelectedValue = domicilio.Ciudad.OID.ToString();
                hidCiudad.Value = domicilio.Ciudad.OID.ToString();
                cboPais.SelectedValue = domicilio.Ciudad.Provincia.Pais.OID.ToString();
                txtDcilio_Observacion.Text = domicilio.Observaciones;
                txtCP.Text = domicilio.CodigoPostal;
                chkDomicilioPcipal.Checked = domicilio.Principal;


                UpdatePanel3.Update();

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "DialogDomicilio(); ", true);

            }

        }


        protected void GridDomicilio_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                if (Borrar != null)
                {
                    Borrar.Settings(new ImageButtonExtDelete());
                }

            }

            ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
            if (Editar != null)
            {

                Editar.Settings(new ImageButtonExtEdit());

            }

        }

        protected void GridContacto_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Borrar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int id = Convert.ToInt32(GridContacto.DataKeys[index].Value);


                if (id > 0)
                {
                    Contacto contacto = Entidad.Contactos.Where(x => x.OID == id).FirstOrDefault();
                    contacto.Persistencia = EstadoPersistencia.DELETE;

                }
                else
                {
                    Entidad.Contactos.RemoveAt(index);

                }
                LoadGridContacts();
            }
            if (e.CommandName == "Editar")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                int oid = Convert.ToInt32(GridContacto.DataKeys[index].Value);
                this.hidContacto.Value = oid.ToString();
                Contacto contacto;
                contacto = Entidad.Contactos.Find(x => x.OID == oid);
                cboTipoContacto.SelectedValue = contacto.TipoContacto.OID.ToString();
                txtEmail.Text = contacto.Email;
                txtTelefono.Text = contacto.Telefono;
                txtFax.Text = contacto.Fax;
                chkPrincipal.Checked = contacto.Principal;

                UpdatePanel2.Update();

                ScriptManager.RegisterStartupScript(Page, typeof(Page), "Edicion", "DialogContact(); ", true);

            }

        }


        protected void GridContacto_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButtonExt Borrar = e.Row.FindControl("btnBorrar") as ImageButtonExt;
                if (Borrar != null)
                {
                    Borrar.Settings(new ImageButtonExtDelete());
                }

            }

            ImageButtonExt Editar = e.Row.FindControl("btnEditar") as ImageButtonExt;
            if (Editar != null)
            {

                Editar.Settings(new ImageButtonExtEdit());

            }

        }


        #region MappingFromObjectToControls

        private void MappingFromObjectToControls()
        {
            this.txtDenominacion.Text= Entidad.Denominacion ;
            this.chkInterna.Checked = Entidad.Interna ;
            this.cboSuperior.SelectedValue = Entidad.Superior == null ? "0" : Entidad.Superior.ToString();
            this.cboJuridiccion.SelectedValue = Entidad.Jurisdiccion == null ? "0" : Entidad.Jurisdiccion.OID.ToString();
        
        }
        #endregion

        #region MappingControlsToObject

        private void MappingControlsToObject()
        {
            Entidad.Denominacion = this.txtDenominacion.Text;
            Entidad.Interna = this.chkInterna.Checked;
            Entidad.Jurisdiccion = GestorJurisdicciones.Obtener(this.cboJuridiccion.SelectedValue.ToInteger());
            Entidad.Superior = cboSuperior.SelectedValue.ToInteger() == 0 ? (int?) null : cboSuperior.SelectedValue.ToInteger();
            
        }
        #endregion

    }
}